package com.jvm;


/**
 *
 * 未被编译器优化的操作：
指令 1：分配一款内存 M
指令 2：在内存 M 上初始化 Singleton 对象
指令 3：将 M 的地址赋值给 instance 变量
 *
 *
 * 编译器优化后的操作指令：
指令 1：分配一块内存 S
指令 2：将 M 的地址赋值给 instance 变量
指令 3：在内存 M 上初始化 Singleton 对象


 线程A                                    线程B
 instance == null ?   ----线程切换--->instance == null ? --------
 分配一块内存M          |             分配一块内存M               |
 Instance = &M----------            Instance = &M             ---->返回未初始化对象 instance
 M = 初始化Singleton对象             M = 初始化Singleton对象


 */
public class Singleton1 {
    // 双重检验锁定 实现单例模式
    static Singleton1 instance;

    static Singleton1 getInstance() {
        if (instance == null) {
            synchronized (Singleton1.class) {
                if (instance == null) {
                    instance = new Singleton1();
                }
            }
        }

        return instance;
    }

}
